/*
 * 对一个结构体实现`fmt::Display`，其中的元素需要一个接一个地处理到，这可能很麻烦。
 * 问题在于每个`write!`都要生成一个`fmt::Result`。正确的实现需要处理所有哦的Result。
 * Rust专门为这个问题提供了`?`操作符
 *
 */

// 在`write!`上使用`?`像这样
// 对`write!`进行尝试，观察是否出错。若发生错误，返回相应错误。否则继续执行后面语句。
// `write!(f, "{}", value);`
// `?`运算符等价于`try!`宏，现在基本不用
// `try!(write!(f, "{}", value));`

// 如下通过`?`对一个`Vec`实现`fmt::Display`
use std::fmt;

// 定义一个包含单个`Vec`的结构体`List`
struct List(Vec<i32>);

impl fmt::Display for List {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // 使用元组的下标获取值，并创建一个`vec`的引用
        let vec = &self.0;

        write!(f, "[")?;

        // 使用`v`对`vec`进行迭代，并用`count`记录迭代次数
        for (count, v) in vec.iter().enumerate() {
            // 对每个元素（第一个除外）加上逗号
            if count != 0 {
                write!(f, ", ")?;
            }
            write!(f, "{}: {}", count ,v)?;
        }

        // 加上配对中括号，并返回一个 `fmt::Result`值
        write!(f, "]")
    }
}

fn main() {
    let v = List(vec![1, 2, 3]);
    println!("{}", v);
}